﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using System.Collections;
using Tibet.Logica;
using Tibet.Entidades;
using Tibet.Logica.Comandos;
using Tibet.Logica.FabricaLogica;

namespace Tibet.Pruebas
{
    /// <summary>
    /// Clase que Consulta los Perfiles de Regla de tipo
    /// Nombre de Clase, Documentar Clases, Nombre de Interface, 
    /// Nombre de Metodo, Documentar Metodos, Nombre de Atributo, 
    /// Tiene Boilerplate, No tiene Boilerplate, Tiene espacio entre parentesis, 
    /// No tiene espacio entre parentesis, Tiene espacio entre Operadores,
    /// No tiene espacio entre operadores, Llaves en la misma linea,
    /// Llaves en una nueva linea, Documentacion de Estructura
    /// </summary>
    [TestFixture]
    public class PruebaPerfilDeRegla
    {

        /// <summary>
        /// Método que permite comprobar si el comando crea el perfil de regla 
        /// <example>Prueba1</example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaPorNombreClase()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Nombre de clase";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "Nombreclase");


        }


        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla 
        /// que tenga documentacion en las Clases"
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaDocumentarClase()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Documentacion de clase";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

            _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

            Assert.IsInstanceOf<EntidadRegla>(_lista);
            Assert.AreEqual(_lista.NombreRegla, "///");


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla de Nombre de Interface"
        /// Probando que asi se tenga un metodo generico que devuelve una entidad
        /// y mediante el casteo se pueda utilizar como queremos.
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaPorNombreInterfaces()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Nombre de interface";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

            _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

            Assert.IsInstanceOf<EntidadRegla>(_lista);
            Assert.AreEqual(_lista.NombreRegla, "INombreInterface");


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla de Nombre de los
        /// Metodos de las clases como por 
        /// <example>ejemplo: public ... Obtener
        /// o public ... obtener" </example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaPorNombreMetodo()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Nombre de metodo";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

            _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

            Assert.IsInstanceOf<EntidadRegla>(_lista);
            Assert.AreEqual(_lista.NombreRegla, "NombreMetodo");


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla para documentar
        /// los metodos de una clase como: 
        /// <example>// o /* o /// </example> "
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaDocumentarMetodo()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Documentacion de metodo";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

            _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

            Assert.IsInstanceOf<EntidadRegla>(_lista);
            Assert.AreEqual(_lista.NombreRegla, "///");


        }


        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla de Nombre de Atributos
        /// <example>_perfilRegla o perfilRegla o PerfilRegla o perfilregla</example>"
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaPorNombreAtributo()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Nombre de atributo";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

            _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

            Assert.IsInstanceOf<EntidadRegla>(_lista);
            Assert.AreEqual(_lista.NombreRegla, "_NombreAtributo");


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla que
        /// contengan documentacion cuando tiene documentacion Boilerplate"
        /// <example>comentarios de licencia, de autores, del historial de cambios
        /// de la fecha de creacion</example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaTieneBoilerplate()
        {

            try
            {
                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "Tiene Boilerplate";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "Tiene Boilerplate");

            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas con"
                                                    + "Boilerplate", aoore);
            }

        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla que
        /// contengan documentacion cuando no tiene documentacion Boilerplate"
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaNoBoilerplate()
        {

            try
            {
            
                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "No tiene boilerplate";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "No Tiene Boilerplate");

            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas sin"
                                                    +"Boilerplate",aoore);
            }

        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por Espacio entre parentesis"
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaTieneEspacioParentesis()
        {

            try
            {

                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "Tiene espacio entre parentesis";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "Tiene espacio entre parentesis");

            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas de espacio"
                                                    +"entre parentesis",aoore);
            }

        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas que no poseen Espacio entre parentesis"
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaNoTieneEspacioParentesis()
        {

            try
            {

                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "No Tiene espacio entre parentesis";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "No Tiene espacio entre parentesis");

            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas de"
                                                    +"espacio sin parentesis",aoore);
            }


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por Espacio entre operadores"
        /// <example>( A + B )</example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaTieneEspacioOperador()
        {

            try
            {
                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "Tiene espacio entre Operadores";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "Tiene espacio entre operadores");

            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas de llaves"
                                                    +"en misma linea",aoore);
            }


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por Espacio entre operadores"
        /// <example>(A+B)</example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaNoTieneEspacioOperador()
        {
            try
            {

                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "No tiene espacio entre parentesis";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "No tiene espacio entre parentesis");
            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas no tiene"
                                                    + "espacio entre parentesis", aoore);
            }

        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por con al final de cada linea "
        /// <example>public ... ) {</example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaLlaveMismaLinea()
        {

            try
            {
                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "Llaves en la misma linea";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "Llaves en la misma linea");

            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas de llaves"
                                                    +"en misma linea",aoore);
            }


        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por con al final de cada linea "
        /// <example>public ... ) 
        ///          { </example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaLlaveNuevaLinea()
        {
            try
            {
                EntidadRegla _lista = null;

                Comando _comando = FabricaComandoRegla.
                                    ObtenerComandoConsultarReglasPorNombre();

                _comando.Cadena = "Llaves en linea nueva";
                _comando.Ejecutar();

                Assert.IsNotNull(_comando.ListaEntidad);

                _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

                Assert.IsInstanceOf<EntidadRegla>(_lista);
                Assert.AreEqual(_lista.NombreRegla, "Llaves en linea nueva");
            }
            catch (ArgumentOutOfRangeException aoore)
            {
                System.Console.WriteLine("No hay inserciones de Reglas de llaves"
                                                    +"en nueva linea",aoore);
            }
        }

        /// <summary>
        /// Método que permite comprobar si el comando trae solo los 
        /// perfiles de reglas por ejemplo Perfil Regla de Documentacion de Estructura"
        /// <example>//comentario o /*comentario*/ o ///<summary>comentario</summary></example>
        /// </summary>
        [TestCase]
        public void EjecutarPerfilReglaDocumentarEstructura()
        {

            EntidadRegla _lista = null;

            Comando _comando = FabricaComandoRegla.
                                ObtenerComandoConsultarReglasPorNombre();

            _comando.Cadena = "Documentacion de estructura";
            _comando.Ejecutar();

            Assert.IsNotNull(_comando.ListaEntidad);

            _lista = (((EntidadRegla)_comando.ListaEntidad.ElementAt(1)));

            Assert.IsInstanceOf<EntidadRegla>(_lista);
            Assert.AreEqual(_lista.NombreRegla, "///");


        }
    }
}